#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
const int N=1e5+10;
const int M=1e6+10; 
int n,m;
LL fa[N];
bool st[N];
struct node
{
	LL x;
	LL y;
	LL z;
}a[M];
LL h[N];
LL ret,cnt;

typedef pair<int,int> PII;
vector<PII> edges[N];
int pos;
void dfs(int x)
{
	st[x]=true;
	ret++;
	
	for(auto& e:edges[x])
	{
		int y=e.first;int z=e.second;
		                                           		
		pos++;
		
		a[pos].x=x;a[pos].y=y;a[pos].z=z;
		                               
		if(!st[y]) dfs(y);
	}
}
bool cmp(node& a,node& b)
{
	int y1=a.y;int y2=b.y;
	if(h[y1]!=h[y2])//优先去高位置边 
	{
		return h[y1]>h[y2];//一定要注意这里返回的是高度的比较 
	}
	else 
	{
		return a.z<b.z;
	}	
}
int find(int x)
{
	if(x==fa[x])  return x;
	else return fa[x]=find(fa[x]);
}
void kk()
{
	for(int i=1;i<=n;i++) fa[i]=i;
	
	sort(a+1,a+1+pos,cmp);
	for(int i=1;i<=pos;i++)
	{
		int x=a[i].x;int y=a[i].y;
		int z=a[i].z;
		
		int fx=find(x);int fy=find(y);
		if(fx!=fy)
		{
			fa[fx]=fy;
			cnt+=z;
		}
	}
	
	
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
	}
	for(int i=1;i<=m;i++)
	{
		int u=0,v=0,z=0;
		cin>>u>>v>>z;
		//一定注意这里的uv是山峰编号，不是高度
		if(h[u]>=h[v]) edges[u].push_back({v,z});
		if(h[v]>=h[u]) edges[v].push_back({u,z}); 
	}
	//一号山峰是最高点 
	dfs(1);//统计出能走到的最多的点
	cout<<ret<<" ";
	kk();
	cout<<cnt<<endl;
	 
	return 0;
}